class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def speak(self):
        print("Wow!")

def make_noise(animal:Animal):  # 多态，以父类作定义声明，以子类做实际工作
    animal.speak()

make_noise(Dog())               # 相同的行为(函数)，传入不同的对象，获得不同的形态
make_noise(Cat())

class Conditioner:     # 抽象类，以父类提供标准，要求子类完成标准
    def cool(self):
        pass
    def wind_space(self):
        pass
    def wind_force(self):
        pass

class Median(Conditioner):
    def cool(self):
        print("Median cool")
    def wind_space(self):
        print("Median wind")
    def wind_force(self):
        print("Median enormous wind")
class Gear(Conditioner):
    def cool(self):
        print("Gear cool")
    def wind_space(self):
        print("Gear wind")
    def wind_force(self):
        print("Gear enormous wind")
class Hand(Conditioner):
    def cool(self):
        print("Hand cool")
    def wind_space(self):
        print("Hand wind")
    def wind_force(self):
        print("Hand enormous wind")

def condition(conditioner:Conditioner):
    conditioner.cool()
    conditioner.wind_force()
    conditioner.wind_space()

# 第一个子类
median_conditioner = Median()
condition(median_conditioner)
# 第二个子类
gear_conditioner = Gear()
condition(gear_conditioner)
# 第三个子类
condition(Hand())

# 注意:上述子类作为不同对象传入相同行为(condition)时，既可以通过变量名(如median_conditioner、gear_conditioner)传入，也可以直接以类名的形式传入，如第61行。二者效果是相同的